package com.meterhuang;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * 来源：https://leetcode-cn.com/problems/reverse-integer
 * 数字反转[easy]
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * 如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  2^31 − 1] ，就返回 0。
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * int范围：-2147483648 和 2147483647
 *   
 * 示例 1：
 * 输入：x = 123
 * 输出：321
 *
 * @author meterhuang
 * @date 2021/04/07 16:46
 */
@Slf4j
public class ReverseInt {

	public static void main(String[] args) {
		int reverse = reverse(-2147483648);
		log.info("{}", reverse);
		reverse = reverseV2(-2147483648);
		log.info("{}", reverse);
	}

	public static int reverse(int x) {
		// 是否负数
		boolean negative = false;
		if (x < 0) {
			negative = true;
		}
		String str = String.valueOf(x);
		if (negative) {
			str = str.substring(1);
		}
		StringBuffer sb = new StringBuffer();
		for (int i = str.length() - 1; i >= 0; i--) {
			sb.append(str.charAt(i));
		}
		BigDecimal bigDecimal = new BigDecimal(sb.toString());
		if (bigDecimal.compareTo(BigDecimal.valueOf(Integer.MAX_VALUE)) > 0) {
			return 0;
		}
		if (negative) {
			bigDecimal = bigDecimal.multiply(BigDecimal.valueOf(-1));
		}
		if (bigDecimal.compareTo(BigDecimal.valueOf(Integer.MIN_VALUE)) < 0) {
			return 0;
		}
		return bigDecimal.intValue();
	}

	/**
	 * 负数%10和负数/10结果都是负数
	 * @param x
	 * @return
	 */
	public static int reverseV2(int x) {
		int reverse = 0;
		while (x != 0) {
			int tail = x % 10;
			x /= 10;
			if (reverse > Integer.MAX_VALUE / 10 || (reverse == Integer.MAX_VALUE && tail > 7)) {
				return 0;
			}
			if (reverse < Integer.MIN_VALUE / 10 || (reverse == Integer.MIN_VALUE && tail < -8)) {
				return 0;
			}
			reverse = reverse * 10 + tail;
		}

		return reverse;
	}

}
